import hashlib
import math
import os
import uuid

# from version import file_system_dir

from datetime import datetime


def generate_uuid_by_time(tag=True):
    # 获取当前时间字符串
    current_time_str = datetime.now().strftime("%Y%m%d%H%M%S")

    # 生成4位UUID
    short_uuid = str(uuid.uuid4())[:8]

    # 组合时间字符串和4位UUID
    if tag:
        return f"{current_time_str}_{short_uuid}"
    else:
        return f"{current_time_str}{short_uuid}"


def generate_digit_number(digits):
    uid = uuid.uuid4().int
    six_digit_number = str(uid)[:digits]
    return six_digit_number


# def filepath(path):
#     if path == file_system_dir:
#         return file_system_dir
#     while path.startswith("/") or path.startswith(".") or path.startswith("~") or path.startswith('\\'):
#         path = path[1:]
#     return os.path.join(file_system_dir, path)


def allowed_xls(filename):
    """检查文件扩展名是否允许"""
    return '.' in filename and \
        filename.rsplit('.', 1)[1].lower() in {'xlsx', 'xls'}


def md5_path(file_path):
    # 创建一个md5对象
    md5 = hashlib.md5()

    # 打开文件，以二进制模式读取
    with open(file_path, "rb") as file:
        # 分块读取文件内容，避免大文件占用过多内存
        for chunk in iter(lambda: file.read(4096), b""):
            md5.update(chunk)

    # 获取最终的MD5哈希值
    return md5.hexdigest()


def md5_file(file):
    # 创建一个md5对象
    md5 = hashlib.md5()

    for chunk in iter(lambda: file.read(4096), b""):
        md5.update(chunk)

    # 获取最终的MD5哈希值
    return md5.hexdigest()


def get_file_size(file_path):
    """获取文件大小"""
    return os.path.getsize(file_path)


def calculate_total_size(paths):
    """计算给定路径列表的文件大小总和"""
    files = []
    total = 0
    for file_path in paths:
        path = filepath(file_path)
        if os.path.isfile(path):
            files.append(path)
        else:
            for filename in os.listdir(path):
                files.append(os.path.join(path, filename))
    for file in files:
        total += get_file_size(file)
    return total


def human_readable_size(size_in_bytes):
    """
    将字节大小转换为可读的文件大小字符串。
    :param size_in_bytes: 文件大小（以字节为单位）
    :return: 可读的文件大小字符串
    """
    units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
    if size_in_bytes == 0:
        return "0B"
    k = 1024.0
    magnitude = int(math.floor(math.log(size_in_bytes, k)))
    value = size_in_bytes / (k ** magnitude)
    return f"{value:.2f}{units[magnitude]}"


def calculate_total_size_read(paths):
    """计算给定路径列表的文件大小总和"""
    return human_readable_size(calculate_total_size(paths))


def parse_readable_size(size_str):
    """
    将可读的文件大小字符串转换为字节。
    :param size_str: 可读的文件大小字符串，例如 "1.15GB"
    :return: 对应的字节数
    """
    units = {
        'KB': 1024,
        'MB': 1024 ** 2,
        'GB': 1024 ** 3,
        'TB': 1024 ** 4,
        'PB': 1024 ** 5,
        'EB': 1024 ** 6,
        'ZB': 1024 ** 7,
        'YB': 1024 ** 8,
        'B': 1
    }

    # 去掉字符串中的空格
    size_str = size_str.strip().upper()

    # 遍历单位，找到匹配的单位
    for unit in units.keys():
        if size_str.endswith(unit):
            # 提取数值部分（去掉单位后的部分）
            value_str = size_str[:-len(unit) - 1]
            # 转换为浮点数
            value = float(value_str)
            # 根据单位计算字节数
            return int(value * units[unit])

    # 如果没有找到有效的单位，抛出异常
    return 0


if __name__ == '__main__':
    print(calculate_total_size_read(['his大王州2025-1-7']))
    print(calculate_total_size_read(['大王洲12.20-1.7.xlsx']))
    print(calculate_total_size_read(['his大王州2025-1-7', '大王洲12.20-1.7.xlsx']))

    print(parse_readable_size('16.58MB') < parse_readable_size('16.18MB'))
    print(parse_readable_size('16.58MB') > parse_readable_size('16.18MB'))
    print(parse_readable_size('16.08MB') > parse_readable_size('16.18MB'))
